using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SqlClient;
using System.Data.Sql;
using System.Data;
//autor: Rosandra
namespace CapaAccesoDatos.Clases
{
    public class RechazoCAD
    {
        //-------------------------------------------------------------------------------//
        // Propiedades de la Clase.                                                      //
        //-------------------------------------------------------------------------------//
        private int id;
        private int idUsuario;
        private int idHorario;
        private DateTime fecha = new DateTime();

        //-------------------------------------------------------------------------------//
        // Accesores publicos de la Clase.                                               //
        //-------------------------------------------------------------------------------//
        public int Id
        {
            get { return this.id; }
        }
        public int IdUsuario
        {
            get { return this.idUsuario; }
        }
        public int IdHorario
        {
            get { return this.idHorario; }
        }
        public DateTime Fecha
        {
            get { return this.fecha; }
        }

        //-------------------------------------------------------------------------------//
        // Estos son los Constructores de la Clase.                                      //
        //-------------------------------------------------------------------------------//
        internal RechazoCAD(int Id, int IdUsuario, int IdHorario, DateTime Fecha)
        {
            this.id = Id;
            this.idUsuario = IdUsuario;
            this.idHorario = IdHorario;
            this.fecha = Fecha;
        }

        //-------------------------------------------------------------------------------//
        //Metodos de la interface(despreciada a favor de metodos estaticos)              //
        //-------------------------------------------------------------------------------//
        public static void Save(RechazoCAD rechazo)
        {
            String SqlCommand = "INSERT INTO " + Constantes.Tablas.Rechazos.Nombre + "(" +
                                Constantes.Tablas.Rechazos.Campo_IdUsuario + "," +
                                Constantes.Tablas.Rechazos.Campo_IdHorario + "," +
                                Constantes.Tablas.Rechazos.Campo_Fecha + ") VALUES (" +
                                rechazo.IdUsuario.ToString() + ", " + 
                                rechazo.IdHorario.ToString() + ", '" + 
                                rechazo.Fecha.ToString() + "')";
            //Sentencia:   
            /* INSERT INTO Tabla (Columna1, Columna2...)        
             * VALUES (Registro1, Registro2....);      
             */

            SqlConnection Conexion = new SqlConnection(Constantes.ConnectionString);
            SqlCommand Comando = new SqlCommand(SqlCommand, Conexion);
            SqlTransaction Tx = null;

            try
            {
                Conexion.Open();              
                Tx = Conexion.BeginTransaction();                 
                Comando.Transaction = Tx;           
                Comando.ExecuteNonQuery();           
                Tx.Commit();      
            }
            catch (Exception Ex)
            {
                Tx.Rollback();
                throw new System.Exception("ERROR: Se ha producido un error en la conexion con la base de datos.\n " +
                           "FUNCION: RechazosCAD.Save(<args>)\n " +
                           "INNEREXCEPT:" + Ex.Message, Ex);
            }
            finally
            {             
                Conexion.Close();
                Comando.Dispose();
                Conexion.Dispose();
            }
            return;
        }
        public static void Update(RechazoCAD rechazo)
        { 
            String SqlCommand = "UPDATE " + Constantes.Tablas.Rechazos.Nombre + " SET " +
                                Constantes.Tablas.Rechazos.Campo_IdUsuario + "=" + rechazo.IdUsuario.ToString() + ", " +
                                Constantes.Tablas.Rechazos.Campo_IdHorario + "=" + rechazo.IdHorario.ToString() + ", " +
                                Constantes.Tablas.Rechazos.Campo_Fecha + "='" + rechazo.Fecha.ToString() +
                                "' WHERE " + Constantes.Tablas.Rechazos.Campo_Id + "=" + rechazo.Id.ToString();
            // Sentencia:
            /* UPDATE Tabla SET Columna1 = valor1, Columna2 = valor2 ...
             * WHERE Id = ObjetoId;
             */
            SqlConnection Conexion = new SqlConnection(Constantes.ConnectionString);
            SqlCommand Comando = new SqlCommand(SqlCommand, Conexion);
            SqlTransaction Tx = null;

            try
            {
                Conexion.Open();            
                Tx = Conexion.BeginTransaction();            
                Comando.Transaction = Tx;           
                Comando.ExecuteNonQuery();         
                Tx.Commit(); 
            }
            catch (Exception Ex)
            {
                Tx.Rollback();
                throw new System.Exception("ERROR: Se ha producido un error en la conexion con la base de datos.\n " +
                           "FUNCION: RechazosCAD.Update(<args>)\n " +
                           "INNEREXCEPT:" + Ex.Message, Ex);
            }
            finally
            {               
                Conexion.Close();
                Comando.Dispose();
                Conexion.Dispose();
            }
            return;
        }
        public static void Delete(RechazoCAD rechazo)
        {
            String SqlCommand = "DELETE FROM " + Constantes.Tablas.Rechazos.Nombre + " WHERE "
                                + Constantes.Tablas.Rechazos.Campo_Id + "= " + rechazo.Id.ToString();

            SqlConnection Conexion = new SqlConnection(Constantes.ConnectionString);
            SqlCommand Comando = new SqlCommand(SqlCommand, Conexion);
            SqlTransaction Tx = null;

            try
            {
                Conexion.Open();                
                Tx = Conexion.BeginTransaction();                
                Comando.Transaction = Tx;     
                Comando.ExecuteNonQuery();            
                Tx.Commit();   
            }
            catch (Exception Ex)
            {
                Tx.Rollback();
                throw new System.Exception("ERROR: Se ha producido un error en la conexion con la base de datos.\n " +
                           "FUNCION: RechazosCAD.Delete(<args>)\n " +
                           "INNEREXCEPT:" + Ex.Message, Ex);
            }
            finally
            {              
                Conexion.Close();
                Comando.Dispose();
                Conexion.Dispose();
            }
            return;
        }

        //-------------------------------------------------------------------------------//
        // Estos son los metodos especiales para el uso de la Capa de Lenguaje de Negocios
        //-------------------------------------------------------------------------------//
        public static int GetRechazosCount(DateTime TiempoInicio, DateTime TiempoFin)
        {
            int count = 0;
            String SqlCommand = "SELECT COUNT(" + Constantes.Tablas.Rechazos.Campo_Id
                                + ") FROM " + Constantes.Tablas.Rechazos.Nombre +
                                " WHERE " + Constantes.Tablas.Rechazos.Campo_IdHorario
                                + " IN (SELECT " + Constantes.Tablas.Horarios.Campo_Id + " FROM "
                                + Constantes.Tablas.Horarios.Nombre + " WHERE "
                                + Constantes.Tablas.Horarios.Campo_Hora_Inicio + " > '"
                                + TiempoInicio.ToString() + "' OR "
                                + Constantes.Tablas.Horarios.Campo_Hora_Inicio + " = '"
                                + TiempoInicio.ToString() + "' AND "
                                + Constantes.Tablas.Horarios.Campo_Hora_Fin + " < '"
                                + TiempoFin.ToString() + "' OR "
                                + Constantes.Tablas.Horarios.Campo_Hora_Fin + " = '"
                                + TiempoFin.ToString() + "')";
            //Sentencia:   
            /* SELECT COUNT(ID) FROM Rechazos
             * WHERE ID_Horario IN
             * (SELECT ID FROM Horarios
             *  WHERE ID_Hora_Inicio > TiempoInicio OR ID_Hora_Inicio = TiempoInicio
             *  AND ID_Hora_Fin < TiempoFin OR ID_Hora_Fin = TiempoFin);
             */

            SqlConnection Conexion = new SqlConnection(Constantes.ConnectionString);
            SqlCommand Comando = new SqlCommand(SqlCommand, Conexion);
            SqlTransaction Tx = null;
            SqlDataReader Cursor = null;

            try
            {
                Conexion.Open();
                Tx = Conexion.BeginTransaction();
                Comando.Transaction = Tx;
                Comando.ExecuteNonQuery();
                Cursor = Comando.ExecuteReader();
                while (Cursor.Read())
                {
                    count = Convert.ToInt32(Cursor[0]);
                }
                Cursor.Close();
                Tx.Commit();
            }
            catch (Exception Ex)
            {
                if (Cursor != null)
                    Cursor.Close();

                Tx.Rollback();
                throw new System.Exception("ERROR: Se ha producido un error en la conexion con la base de datos.\n " +
                           "FUNCION: RechazosCAD.GetRechazosCountOverload(<args>)\n " +
                           "INNEREXCEPT:" + Ex.Message, Ex);
            }
            finally
            {
                Conexion.Close();
                Cursor.Close();
                Comando.Dispose();
                Conexion.Dispose();
            }
            return count;
        }

        /* GetRechazosCount:
         * Esta version devuelve la cantidad total de rechazos en el intervalo
         */
        public static int GetRechazosCount()
        {
            int count = 0;
            String SqlCommand = "SELECT COUNT(" + Constantes.Tablas.Rechazos.Campo_Id
                                + ") FROM " + Constantes.Tablas.Rechazos.Nombre;
            //Sentencia:   
            /* SELECT COUNT(ID) FROM Rechazos
             */

            SqlConnection Conexion = new SqlConnection(Constantes.ConnectionString);
            SqlCommand Comando = new SqlCommand(SqlCommand, Conexion);
            SqlTransaction Tx = null;
            SqlDataReader Cursor = null;

            try
            {
                Conexion.Open();
                Tx = Conexion.BeginTransaction();
                Comando.Transaction = Tx;
                Comando.ExecuteNonQuery();
                Cursor = Comando.ExecuteReader();
                while (Cursor.Read())
                {
                    count = Convert.ToInt32(Cursor[0]);
                }
                Cursor.Close();
                Tx.Commit();                
            }
            catch (Exception Ex)
            {
                if (Cursor != null)
                    Cursor.Close();

                Tx.Rollback();
                throw new System.Exception("ERROR: Se ha producido un error en la conexion con la base de datos.\n " +
                           "FUNCION: RechazosCAD.GetRechazosCount(<args>)\n " +
                           "INNEREXCEPT:" + Ex.Message, Ex);
            }
            finally
            {
                Conexion.Close();
                Cursor.Close();
                Comando.Dispose();
                Conexion.Dispose();
            }
            return count;
        }

        /* BuscarPorUsuario:
         * Este metodo devuelve una lista de todos los rechazos de un usuario
         */
        public static List<RechazoCAD> BuscarPorUsuario(int id_Usuario)
        {
            List<RechazoCAD> listaRechazos = null;
            String SqlCommand = "SELECT * FROM " + Constantes.Tablas.Rechazos.Nombre +
                                " WHERE " + Constantes.Tablas.Rechazos.Campo_IdUsuario
                                + " = " + id_Usuario.ToString();
            //Sentencia:   
            /* SELECT * FROM Rechazos
             * WHERE ID_Usuario = id_Usuario;
             */

            SqlConnection Conexion = new SqlConnection(Constantes.ConnectionString);
            SqlCommand Comando = new SqlCommand(SqlCommand, Conexion);
            SqlTransaction Tx = null;
            SqlDataReader Cursor = null;

            try
            {
                Conexion.Open();            
                Tx = Conexion.BeginTransaction();              
                Comando.Transaction = Tx; 
                Comando.ExecuteNonQuery(); 
                Cursor = Comando.ExecuteReader();
                while (Cursor.Read())
                {
                    RechazoCAD rechazo = new RechazoCAD (Convert.ToInt32(Cursor[Constantes.Tablas.Rechazos.Campo_Id]),
                                                          Convert.ToInt32(Cursor[Constantes.Tablas.Rechazos.Campo_IdUsuario]),
                                                          Convert.ToInt32(Cursor[Constantes.Tablas.Rechazos.Campo_IdHorario]),
                                                          Convert.ToDateTime(Cursor[Constantes.Tablas.Rechazos.Campo_Fecha]));
                    listaRechazos.Add(rechazo);
                }
                Cursor.Close();
                Tx.Commit();                
            }
            catch (Exception Ex)
            {
                if (Cursor != null)
                    Cursor.Close();

                Tx.Rollback();
                throw new System.Exception("ERROR: Se ha producido un error en la conexion con la base de datos.\n " +
                           "FUNCION: RechazosCAD.BuscarPorUsuario(<args>)\n " +
                           "INNEREXCEPT:" + Ex.Message, Ex);
            }
            finally
            {               
                Conexion.Close();
                Cursor.Close();
                Comando.Dispose();
                Conexion.Dispose();
            }
            return listaRechazos;
        }

        /* BuscarPorHorario:
         * Este metodo devuelve una lista de todos los usuarios rechazados en un horario especifico
         */
        public static List<RechazoCAD> BuscarPorHorario(int id_Horario)
        {
            List<RechazoCAD> listaRechazos = null;
            String SqlCommand = "SELECT * FROM " + Constantes.Tablas.Rechazos.Nombre +
                                " WHERE " + Constantes.Tablas.Rechazos.Campo_IdHorario
                                + " = " + id_Horario.ToString();
            //Sentencia:   
            /* SELECT * FROM Rechazos
             * WHERE ID_Horario = id_Horario;
             */

            SqlConnection Conexion = new SqlConnection(Constantes.ConnectionString);
            SqlCommand Comando = new SqlCommand(SqlCommand, Conexion);
            SqlTransaction Tx = null;
            SqlDataReader Cursor = null;

            try
            {
                Conexion.Open();                 
                Tx = Conexion.BeginTransaction();                
                Comando.Transaction = Tx; 
                Comando.ExecuteNonQuery();        
                Cursor = Comando.ExecuteReader();
                while (Cursor.Read())
                {
                    RechazoCAD rechazo = new RechazoCAD(Convert.ToInt32(Cursor[Constantes.Tablas.Rechazos.Campo_Id]),
                                                          Convert.ToInt32(Cursor[Constantes.Tablas.Rechazos.Campo_IdUsuario]),
                                                          Convert.ToInt32(Cursor[Constantes.Tablas.Rechazos.Campo_IdHorario]),
                                                          Convert.ToDateTime(Cursor[Constantes.Tablas.Rechazos.Campo_Fecha]));
                    listaRechazos.Add(rechazo);
                }
                Cursor.Close();
                Tx.Commit();                
            }
            catch (Exception Ex)
            {
                if (Cursor != null)
                    Cursor.Close();

                Tx.Rollback();
                throw new System.Exception("ERROR: Se ha producido un error en la conexion con la base de datos.\n " +
                           "FUNCION: RechazosCAD.BuscarPorHorario(<args>)\n " +
                           "INNEREXCEPT:" + Ex.Message, Ex);
            }
            finally
            {               
                Conexion.Close();
                Cursor.Close();
                Comando.Dispose();
                Conexion.Dispose();
            }
            return listaRechazos;
        }

        /* BuscarPorFecha:
         * Este metodo devuelve una lista de todos los usuarios rechazados en una fecha especifica
         */
        public static List<RechazoCAD> BuscarPorFecha(DateTime Fecha)
        {   
            List<RechazoCAD> listaRechazos = null;
            String SqlCommand = "SELECT * FROM " + Constantes.Tablas.Rechazos.Nombre +
                                " WHERE " + Constantes.Tablas.Rechazos.Campo_Fecha
                                + " = '" + Fecha.ToString() + "'";
            //Sentencia:   
            /* SELECT * FROM Rechazos
             * WHERE Fecha = 'Fecha';
             */

            SqlConnection Conexion = new SqlConnection(Constantes.ConnectionString);
            SqlCommand Comando = new SqlCommand(SqlCommand, Conexion);
            SqlTransaction Tx = null;
            SqlDataReader Cursor = null;

            try
            {
                Conexion.Open();           
                Tx = Conexion.BeginTransaction();                
                Comando.Transaction = Tx; 
                Comando.ExecuteNonQuery();          
                Cursor = Comando.ExecuteReader();
                while (Cursor.Read())
                {
                    RechazoCAD rechazo = new RechazoCAD(Convert.ToInt32(Cursor[Constantes.Tablas.Rechazos.Campo_Id]),
                                                          Convert.ToInt32(Cursor[Constantes.Tablas.Rechazos.Campo_IdUsuario]),
                                                          Convert.ToInt32(Cursor[Constantes.Tablas.Rechazos.Campo_IdHorario]),
                                                          Convert.ToDateTime(Cursor[Constantes.Tablas.Rechazos.Campo_Fecha]));
                    listaRechazos.Add(rechazo);
                }
                Cursor.Close();
                Tx.Commit();
            }
            catch (Exception Ex)
            {
                if (Cursor != null)
                    Cursor.Close();

                Tx.Rollback();
                throw new System.Exception("ERROR: Se ha producido un error en la conexion con la base de datos.\n " +
                           "FUNCION: RechazosCAD.BuscarPorFecha(<args>)\n " +
                           "INNEREXCEPT:" + Ex.Message, Ex);
            }
            finally
            {             
                Conexion.Close();
                Cursor.Close();
                Comando.Dispose();
                Conexion.Dispose();
            }
            return listaRechazos;
        }        
    }
}
